home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 076-100 / disk_093 / dme / main.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  13KB  |  655 lines

  1.  
  2. /*
  3.  * MAIN.C
  4.  *
  5.  *    (C)Copyright 1987 by Matthew Dillon, All Rights Reserved.
  6.  *
  7.  */
  8.  
  9. #include "defs.h"
  10.  
  11. #define IDCMPFLAGS   CLOSEWINDOW|NEWSIZE|RAWKEY|MOUSEBUTTONS|ACTIVEWINDOW|MOUSEMOVE
  12.  
  13.  
  14. NW Nw = {
  15.    0, 1, 640, 199, -1, -1,
  16.    IDCMPFLAGS,
  17.    ACTIVATE|WINDOWSIZING|WINDOWDRAG|WINDOWDEPTH|WINDOWCLOSE|NOCAREREFRESH|RMBTRAP,
  18.    NULL, NULL, (u_char *)"   WAIT   ",
  19.    NULL, NULL,
  20.    32, 32, -1, -1,
  21.    WBENCHSCREEN
  22. };
  23.  
  24. short Sharedrefs;
  25. struct MsgPort *Sharedport;
  26. DISKOBJ *Do;
  27. WBS    *Wbs;
  28.  
  29. WIN *Win;
  30. RP  *Rp;
  31.  
  32. short Xsize,  Ysize;        /* font character sizes        */
  33. short Rows,  Columns;        /* character rows/cols available       */
  34. short Xbase,  Ybase;        /* offset pixel base for display       */
  35. short XTbase,YTbase;        /* used for text display           */
  36. short Xpixs,  Ypixs;        /* actual # X/Y pixels available       */
  37. short Mx, My;
  38.  
  39. u_char *av[8];
  40. char Quitflag;
  41. char Overide;
  42. char SizeOveride;
  43. char Wdisable = 1;        /* Disable icon save               */
  44. char MShowTitle, MForceTitle;
  45. short Nwwidth, Nwheight, Nwtopedge, Nwleftedge;
  46.  
  47. int Enable_Abort;
  48.  
  49. extern ED E, *Ep, *Base;
  50. extern char memoryfail;
  51. extern WIN *opensharedwindow();
  52. extern IMESS *GetMsg();
  53.  
  54. static char *Ffile;
  55.  
  56. main(mac, mav)
  57. char *mav[];
  58. {
  59.     register IMESS *im;
  60.     register WIN *win;
  61.     char nf, ni;        /* # files on command line    */
  62.     char notdone;
  63.     char iawm = 0;
  64.     char dontwait = 0;
  65.     short i;
  66.     short Code;
  67.  
  68.     init_command();
  69.     Nwwidth = Nw.Width;
  70.     Nwheight= Nw.Height;
  71.     Nwtopedge=Nw.TopEdge;
  72.     Nwleftedge=Nw.LeftEdge;
  73.     Enable_Abort = 0;
  74.     if (!openlibs(INTUITION_LIB|GRAPHICS_LIB))
  75.     exiterr("cannot open intuition or graphics library");
  76.     if (mac == 0) {
  77.     long oldlock;
  78.     Wdisable = 0;
  79.     Wbs = (WBS *)mav;
  80.     if (!openlibs(ICON_LIB))
  81.         exiterr("unable to open icon library");
  82.     oldlock = CurrentDir(Wbs->sm_ArgList[0].wa_Lock);   /* tool */
  83.     Do = GetDiskObject(Wbs->sm_ArgList[0].wa_Name);
  84.     CurrentDir(oldlock);
  85.     if (Do == NULL)
  86.         exiterr("unable to get disk object");
  87.     mac = 99;
  88.     }
  89.  
  90.     resethash();
  91.  
  92.     if (Do) {
  93.     ops(Do->do_ToolTypes, 1);
  94.     nf = Wbs->sm_NumArgs - 1;
  95.     E.dirlock = Wbs->sm_ArgList[0].wa_Lock;
  96.     } else {
  97.     nf = ops(mav+1, 0);
  98.     }
  99.  
  100.     for (ni = 0, i = 1; i < mac; ++i) {
  101.     register char *str;
  102.     register DISKOBJ *dso;
  103.     long oldlock;
  104.     if (Wbs) {
  105.         if (i > nf)
  106.         break;
  107.         str = Wbs->sm_ArgList[i].wa_Name;
  108.         oldlock = CurrentDir(Wbs->sm_ArgList[i].wa_Lock);
  109.         if (dso = GetDiskObject(Wbs->sm_ArgList[i].wa_Name)) {
  110.         ops(dso->do_ToolTypes, 1);
  111.         FreeDiskObject(dso);
  112.         }
  113.         E.dirlock = CurrentDir(oldlock);
  114.     } else {
  115.         str = mav[i];
  116.         if (*str == '-')
  117.         continue;
  118.     }
  119.     do_newwindow(nf > 1, ni * 10);
  120.     ++ni;
  121.     av[0] = (u_char *)"newfile";
  122.     av[1] = (u_char *)str;
  123.     do_edit();
  124.     MForceTitle = 1;
  125.     window_title();
  126.     }
  127.     if (i == 1)             /* no files to edit */
  128.     do_newwindow(nf > 1, ni * 10);
  129.  
  130.     mountrequest(0);
  131.     av[0] = NULL;
  132.     av[1] = (u_char *)"s:.edrc";
  133.     do_source();
  134.     av[0] = NULL;
  135.     av[1] = (u_char *)((Ffile) ? Ffile : ".edrc");
  136.     do_source();
  137.     mountrequest(1);
  138.     title("DME V1.27 (c)CopyRight 1987 Matthew Dillon,  All Rights Reserved                  ");
  139.     text_titleupdate();
  140. loop:
  141.     if (!E.iconmode)
  142.     text_cursor(1);
  143.     for (notdone = 1; !Quitflag && notdone;) {
  144.     char mmove = 0;
  145.     short mqual;
  146.  
  147.     if (!E.iconmode)
  148.         window_title();
  149.     if (dontwait)
  150.         --dontwait;
  151.     else
  152.         WaitPort(Win->UserPort);
  153.     while (im = (IMESS *)GetMsg(Win->UserPort)) {
  154.         Abortcommand = 0;
  155.         Code = im->Code;
  156.         if (im->IDCMPWindow != Win) {
  157.         Overide = 0;
  158.         if (ComLineMode)
  159.             escapecomlinemode();
  160.         text_sync();
  161.         MShowTitle = 0;
  162.         if (!E.iconmode)
  163.             window_title();
  164.         if (text_switch(im->IDCMPWindow) == 0) {
  165.             ReplyMsg(im);
  166.             continue;
  167.         }
  168.         if (!E.iconmode) {
  169.             set_window_params();
  170.             window_title();
  171.         }
  172.         }
  173.         Mx = im->MouseX;
  174.         My = im->MouseY;
  175.         switch(im->Class) {
  176.         case NEWSIZE:
  177.         if (!E.iconmode) {
  178.             if (ComLineMode)
  179.             escapecomlinemode();
  180.             set_window_params();
  181.             if (!text_sync())
  182.                text_redisplay();
  183.             text_cursor(1);
  184.         }
  185.         break;
  186.         case MOUSEBUTTONS:
  187.         switch(Code) {
  188.         case SELECTDOWN:
  189.         case MENUDOWN:
  190.             if (E.iconmode || iawm) {
  191.             uniconify();
  192.             break;
  193.             }
  194.             ReportMouse(-1, Win);
  195.             uniconify();
  196.             text_cursor(0);
  197.             keyctl(im->Code, im->Qualifier);
  198.             text_cursor(1);
  199.             break;
  200.         case SELECTUP:
  201.         case MENUUP:
  202.             ReportMouse(0, Win);
  203.             break;
  204.         }
  205.         break;
  206.         case RAWKEY:
  207.         if (E.iconmode) {
  208.             uniconify();
  209.             break;
  210.         }
  211.         text_cursor(0);
  212.         keyctl(im->Code, im->Qualifier);
  213.         text_cursor(1);
  214.         break;
  215.         case CLOSEWINDOW:
  216.         if (ComLineMode)
  217.             escapecomlinemode();
  218.         text_sync();
  219.         notdone = 0;
  220.         break;
  221.         case ACTIVEWINDOW:
  222.         if (!E.iconmode)
  223.             iawm = 1;
  224.         break;
  225.         case MOUSEMOVE:
  226.         mmove = 1;
  227.         mqual = im->Qualifier;
  228.         break;
  229.         }
  230.         if (im)
  231.         ReplyMsg(im);
  232.         if (notdone == 0 || Quitflag) {
  233.         dontwait = 2;
  234.         goto boom;
  235.         }
  236.     }
  237.     iawm = 0;
  238.     if (mmove) {
  239.         uniconify();
  240.         mmove = 0;
  241.         text_cursor(0);
  242.         keyctl(QMOVE, mqual);
  243.         text_cursor(1);
  244.     }
  245.     closesharedwindow(NULL);
  246.     }
  247. boom:
  248.     if (E.Modified && !Overide) {
  249.     uniconify();
  250.     Overide = 1;
  251.     SetWindowTitles(Win, "*** File has been modified ***", NULL);
  252.     Quitflag = 0;
  253.     goto loop;
  254.     }
  255.     SetWindowTitles(Win, "", -1);
  256.     text_uninit();            /* uninitialize text portion    */
  257.     closesharedwindow(Win);
  258.     if (Base) {
  259.     Quitflag = 0;
  260.     Win = E.Win;            /* make arbitrary other window act. */
  261.     Rp = Win->RPort;
  262.     if (!E.iconmode)
  263.         set_window_params();
  264.     text_load();
  265.     MShowTitle = 0;
  266.     goto loop;
  267.     }
  268.     closesharedwindow(NULL);
  269.     if (Do)
  270.     FreeDiskObject(Do);
  271.     closelibs(-1);
  272.     dealloc_hash();
  273. }
  274.  
  275. do_iconify()
  276. {
  277.     if (!ComLineMode)
  278.     iconify();
  279. }
  280.  
  281. do_tomouse()
  282. {
  283.     text_position((Mx-Xbase)/Xsize, (My-Ybase)/Ysize);
  284. }
  285.  
  286. iconify()
  287. {
  288.     if (!E.iconmode) {
  289.     E.Winx        = Win->LeftEdge;
  290.     E.Winy        = Win->TopEdge;
  291.     E.Winwidth  = Win->Width;
  292.     E.Winheight = Win->Height;
  293.     Nw.Height = 10;
  294.     Nw.Width  = 20 + 5*8 + strlen(E.Name)*8;
  295.     Nw.LeftEdge= E.IWinx;
  296.     Nw.TopEdge = E.IWiny;
  297.     if (Nw.LeftEdge + Nw.Width > Win->WScreen->Width)
  298.         Nw.LeftEdge = Win->WScreen->Width - Nw.Width;
  299.     if (Nw.TopEdge + Nw.Height > Win->WScreen->Height)
  300.         Nw.TopEdge = Win->WScreen->Height - Nw.Height;
  301.     Nw.Title = Ep->Wtitle;
  302.     Nw.Flags &= ~(WINDOWSIZING|WINDOWDEPTH);
  303.     Nw.Flags |= BORDERLESS;
  304.     sprintf(Ep->Wtitle, "%s %s    ", E.Name, ((E.Modified) ? "(mod)":""));
  305.     closesharedwindow(Win);
  306.     Win = E.Win = Ep->Win = opensharedwindow(&Nw);
  307.     Nw.Flags |= WINDOWSIZING|WINDOWDEPTH;
  308.     Nw.Flags &= ~BORDERLESS;
  309.     Rp = Win->RPort;
  310.     }
  311.     E.iconmode = 1;
  312. }
  313.  
  314. uniconify()
  315. {
  316.     if (E.iconmode) {
  317.     E.IWinx = Win->LeftEdge;
  318.     E.IWiny = Win->TopEdge;
  319.     closesharedwindow(Win);
  320.     Nw.LeftEdge = E.Winx;
  321.     Nw.TopEdge  = E.Winy;
  322.     Nw.Width    = E.Winwidth;
  323.     Nw.Height   = E.Winheight;
  324.     Nw.Title = Ep->Wtitle;
  325.     Win = E.Win = Ep->Win = opensharedwindow(&Nw);
  326.     Rp = Win->RPort;
  327.     set_window_params();
  328.     if (!text_sync())
  329.         text_redisplay();
  330.     text_cursor(1);
  331.     MShowTitle = 0;
  332.     window_title();
  333.     }
  334.     E.iconmode = 0;
  335. }
  336.  
  337.  
  338. do_newwindow(makesmall, deltaheight)
  339. {
  340.     WIN *win;
  341.     int msadj = makesmall;
  342.  
  343.     if (SizeOveride)
  344.     msadj = 0;
  345.     if (Ep)
  346.     text_sync();
  347.     Nw.Title = (u_char *)"    OK    ";
  348.     Nw.Width = Nwwidth;
  349.     Nw.Height= Nwheight;
  350.     Nw.LeftEdge = Nwleftedge;
  351.     Nw.TopEdge    = Nwtopedge;
  352.     if (msadj > 0) {            /* deltaheight must be valid    */
  353.     Nw.TopEdge = deltaheight + 16;
  354.     Nw.LeftEdge= 10*8;
  355.     Nw.Flags &= ~ACTIVATE;
  356.     Nw.Width = 40*8;
  357.     Nw.Height= 10*8;
  358.     if (Nw.TopEdge + Nw.Height > 200)
  359.         Nw.TopEdge = deltaheight = 200 - Nw.Height;
  360.     }
  361.     win = opensharedwindow(&Nw);
  362.     Nw.Flags |= ACTIVATE;
  363.     if (win) {
  364.     Win = win;            /* set new window   */
  365.     Rp = Win->RPort;
  366.     text_init();            /* initialize        */
  367.     text_load();
  368.     set_window_params();
  369.     if (makesmall != -1)        /* if deltaheight valid */
  370.         E.IWiny = deltaheight + 16;
  371.     }
  372. }
  373.  
  374. WIN *
  375. TOpenWindow(nw)
  376. NW *nw;
  377. {
  378.     WIN *win;
  379.  
  380.     while ((win = OpenWindow(nw)) == NULL) {
  381.     if (nw->Width < 50 || nw->Height < 50)
  382.         break;
  383.     nw->Width -= 10;
  384.     nw->Height-= 10;
  385.     }
  386.     return(win);
  387. }
  388.  
  389.  
  390. WIN *
  391. opensharedwindow(nw)
  392. NW *nw;
  393. {
  394.     WIN *win;
  395.  
  396.     if (Sharedport)
  397.     nw->IDCMPFlags = NULL;
  398.     else
  399.     nw->IDCMPFlags = IDCMPFLAGS;
  400.     win = TOpenWindow(nw);
  401.     if (win) {
  402.     if (Sharedport) {
  403.         win->UserPort = Sharedport;
  404.         ModifyIDCMP(win, IDCMPFLAGS);
  405.     } else {
  406.         Sharedport = win->UserPort;
  407.     }
  408.     ++Sharedrefs;
  409.     }
  410.     return(win);
  411. }
  412.  
  413.  
  414. closesharedwindow(win)
  415. WIN *win;
  416. {
  417.     static WIN *wunlink;
  418.     register IMESS *im;
  419.     char notoktoclosenow = 0;
  420.  
  421.     if (win) {
  422.     SetWindowTitles(win, "", -1);
  423.     Forbid();
  424.     win->UserPort = NULL;
  425.     ModifyIDCMP(win, GADGETUP);    /* NEVER occurs */
  426.  
  427.     notoktoclosenow = 1;
  428.  
  429.     Permit();
  430.     if (notoktoclosenow) {
  431.         win->UserData = (char *)wunlink;
  432.         wunlink = win;
  433.     } else {
  434.         CloseWindow(win);
  435.     }
  436.     --Sharedrefs;
  437.     } else {
  438.     if (Sharedrefs == 0 && Sharedport) {
  439.         DeletePort(Sharedport);
  440.         Sharedport = NULL;
  441.     }
  442.     for (win = wunlink; win; win = wunlink) {
  443.         wunlink = (WIN *)win->UserData;
  444.         CloseWindow(win);
  445.     }
  446.     wunlink = NULL;
  447.     }
  448. }
  449.  
  450.  
  451. getyn(text)
  452. char *text;
  453. {
  454.     int result;
  455.     ITEXT *body, *pos, *neg;
  456.  
  457.     body = (ITEXT *)AllocMem(sizeof(ITEXT), 0);
  458.     pos  = (ITEXT *)AllocMem(sizeof(ITEXT), 0);
  459.     neg  = (ITEXT *)AllocMem(sizeof(ITEXT), 0);
  460.     bzero(body, sizeof(ITEXT));
  461.     bzero(pos , sizeof(ITEXT));
  462.     bzero(neg , sizeof(ITEXT));
  463.     body->BackPen = pos->BackPen = neg->BackPen = 1;
  464.     body->DrawMode= pos->DrawMode= neg->DrawMode= AUTODRAWMODE;
  465.     body->LeftEdge = 10;
  466.     body->TopEdge  = 12;
  467.     body->IText    = (u_char *)text;
  468.     pos->LeftEdge = AUTOLEFTEDGE;
  469.     pos->TopEdge = AUTOTOPEDGE;
  470.     pos->IText = (u_char *)"OK";
  471.     neg->LeftEdge = AUTOLEFTEDGE;
  472.     neg->TopEdge = AUTOTOPEDGE;
  473.     neg->IText = (u_char *)"CANCEL";
  474.     result = AutoRequest(Win,body,pos,neg,0,0,320,58);
  475.     FreeMem(body, sizeof(ITEXT));
  476.     FreeMem(pos , sizeof(ITEXT));
  477.     FreeMem(neg , sizeof(ITEXT));
  478.     return(result);
  479. }
  480.  
  481.  
  482. title(buf)
  483. char *buf;
  484. {
  485.     SetWindowTitles(Win, buf, -1);
  486.     MShowTitle = 1;
  487. }
  488.  
  489. window_title()
  490. {
  491.     static char cmodified;
  492.     int len;
  493.     char *mod;
  494.  
  495.     if (memoryfail) {
  496.     SetWindowTitles(Win, " -- NO MEMORY -- ", -1);
  497.     text_redisplay();
  498.     memoryfail = 0;
  499.     return(0);
  500.     }
  501.     if (MForceTitle) {
  502.     cmodified = -1;
  503.     MShowTitle = 0;
  504.     MForceTitle = 0;
  505.     }
  506.     if (MShowTitle) {
  507.     MShowTitle = 0;
  508.     return(0);
  509.     }
  510.     if (text_titleupdate() || cmodified != E.Modified) {
  511.     cmodified = E.Modified;
  512.     mod = (E.Modified) ? " (modified)" : "";
  513.     sprintf(Ep->Wtitle, "%3ld/%-3ld %s%s ", text_lineno(), text_lines(), text_name(), mod);
  514.     if (!text_imode())
  515.         strcat(Ep->Wtitle, "Ovr ");
  516.     len = strlen(Ep->Wtitle);
  517.     if (len < Columns && Columns < 128) {
  518.         bset(Ep->Wtitle+len, Columns - len + 1, ' ');
  519.         Ep->Wtitle[Columns + 1] = 0;
  520.     }
  521.     SetWindowTitles(Win, Ep->Wtitle, -1);
  522.     }
  523. }
  524.  
  525. set_window_params()
  526. {
  527.     Xsize = Rp->Font->tf_XSize;
  528.     Ysize = Rp->Font->tf_YSize;
  529.     Xbase = Win->BorderLeft;
  530.     Ybase = Win->BorderTop;
  531.     Xpixs   = Win->Width - Win->BorderRight - Xbase;
  532.     Ypixs   = Win->Height- Win->BorderBottom- Ybase;
  533.     Columns = Xpixs / Xsize;
  534.     Rows    = Ypixs / Ysize;
  535.     XTbase  =  Xbase;
  536.     YTbase  =  Ybase + Rp->Font->tf_Baseline;
  537. }
  538.  
  539.  
  540. exiterr(str)
  541. char *str;
  542. {
  543.     if (Output())
  544.     puts(str);
  545.     exit(1);
  546. }
  547.  
  548. breakcheck()
  549. {
  550.    if (SetSignal(0,0) & SIGBREAKF_CTRL_C)
  551.       return (1);
  552.    else
  553.       return (0);
  554. }
  555.  
  556. breakreset()
  557. {
  558.    SetSignal(0, SIGBREAKF_CTRL_C);
  559. }
  560.  
  561. /*
  562.  *  leftedge n
  563.  *  topedge  n
  564.  *  width    n
  565.  *  height   n
  566.  */
  567.  
  568. do_windowparm()
  569. {
  570.     switch(av[0][0]) {
  571.     case 'l':
  572.     Nwleftedge = atoi(av[1]);
  573.     break;
  574.     case 't':
  575.     Nwtopedge = atoi(av[1]);
  576.     break;
  577.     case 'w':
  578.     Nwwidth = atoi(av[1]);
  579.     break;
  580.     case 'h':
  581.     Nwheight = atoi(av[1]);
  582.     break;
  583.     }
  584. }
  585.  
  586. /*
  587.  *  resize cols rows
  588.  */
  589.  
  590. do_resize()
  591. {
  592.     int cols = atoi(av[1]);
  593.     int rows = atoi(av[2]);
  594.     short width = (cols*Win->RPort->Font->tf_XSize) + Win->BorderLeft + Win->BorderRight;
  595.     short height= (rows*Win->RPort->Font->tf_YSize) + Win->BorderTop + Win->BorderBottom;
  596.  
  597.     if (width < 16 || height < 16 ||
  598.     width > Win->WScreen->Width - Win->LeftEdge ||
  599.     height > Win->WScreen->Height - Win->TopEdge) {
  600.     title ("window too big (try moving to upper left corner and retrying)");
  601.     return(0);
  602.     }
  603.     SizeWindow(Win, width - Win->Width, height - Win->Height);
  604.     Delay(50*2);    /* wait 2 seconds */
  605. }
  606.  
  607. ops(av, iswb)
  608. register char *av[];
  609. {
  610.     register short nonops;
  611.     register short i;
  612.     register long val;
  613.     register char *str;
  614.  
  615.     for (i = nonops = 0; str = av[i]; ++i) {
  616.     if (iswb) {
  617.         if (strncmp(str, "ARG", 3) == 0) {
  618.         while (*str && *str != '-')
  619.             ++str;
  620.         }
  621.     }
  622.     if (*str == '-') {
  623.         val = atoi(str+2);
  624.         switch(str[1]) {
  625.         case 'f':
  626.         Ffile = str+2;
  627.         break;
  628.         case 'b':
  629.         SizeOveride = 1;
  630.         break;
  631.         case 't':
  632.         Nwtopedge = val;
  633.         break;
  634.         case 'l':
  635.         Nwleftedge= val;
  636.         break;
  637.         case 'w':
  638.         SizeOveride = 1;
  639.         Nwwidth   = val;
  640.         break;
  641.         case 'h':
  642.         SizeOveride = 1;
  643.         Nwheight  = val;
  644.         break;
  645.         }
  646.     } else {
  647.         ++nonops;
  648.     }
  649.     }
  650.     return(nonops);
  651. }
  652.  
  653.  
  654.  
  655.